/**
 *
 * @description: 跟微信调用的api相关
 * @author: junyong.hong
 * @createTime: 2018/10/10
 * @version: 1.0.0.0
 * @history:
 *    1、
 *    2、
 *
 */
const sha1 = require('sha1')
// 接收原始数据
const getRawBody = require('raw-body')
const util = require('./util')

module.exports = (config, reply) => {
    return async (ctx, next) => {
        // console.log(ctx.query)
        const {
            // 微信加密签名
            signature,
            // 时间戳
            timestamp,
            // 随机数
            nonce,
            // 随机字符串
            echostr
        } = ctx.query

        const token = config.token
        let str = [token, timestamp, nonce].sort().join('')
        const sha = sha1(str)

        // 判断请求方式
        if (ctx.method === 'GET') {
            // 判断与签名值是否一样
            if (sha === signature) {
                ctx.body = echostr
            } else {
                ctx.body = 'Failed'
            }
        } else if (ctx.method === 'POST') {
            if (sha !== signature) {
                return (ctx.body = 'Failed')
            }

            // 微信推送过来的data
            const data = await getRawBody(ctx.req, {
                length: ctx.length,
                // 体积限制1M
                limit: '1mb',
                // 编码格式
                encoding: ctx.charset
            })

            console.log(data)

            // 解析xml
            const content = await util.parseXML(data)
            // console.log('content', content)
            // { xml:
            // { ToUserName: [ 'gh_f8179c19c750' ],
            //     FromUserName: [ 'oaxz45kTIVF1JeueRTSLzHwNtwh0' ],
            //     CreateTime: [ '1539174992' ],
            //     MsgType: [ 'text' ],
            //     Content: [ '哈哈' ],
            //     MsgId: [ '6610706253887511419' ] } }

            // 把xml解析成json对象
            const message = util.formatMessage(content.xml)
            // console.log('message', message)
            // { ToUserName: 'gh_f8179c19c750',
            //     FromUserName: 'oaxz45kTIVF1JeueRTSLzHwNtwh0',
            //     CreateTime: '1539174992',
            //     MsgType: 'text',
            //     Content: '哈哈',
            //     MsgId: '6610706253887511419' }

            // 解析后的挂载到weixin上
            ctx.weixin = message

            // 回复的业务代码（调用wechat/replay.js下的方法）
            await reply.apply(ctx, [ctx, next])

            const replyBody = ctx.body
            const msg = ctx.weixin
            // 微信回复模版
            const xml = util.tpl(replyBody, msg)

            console.log('xml', xml)

            ctx.status = 200
            ctx.type = 'application/xml'
            ctx.body = xml
        }
    }
}